package org.csu.softwaremetrics_demo.metric.ck;

/**
 * NOM（Number of Methods）度量类
 * 用于计算类中所有方法的数量，包括所有访问修饰符的方法
 * 继承自AST访问器，实现了Metric接口
 */

import org.csu.softwaremetrics_demo.entity.common.CKMetricSingleClass;
import org.csu.softwaremetrics_demo.entity.result.Result;
import org.csu.softwaremetrics_demo.metric.Metric;
import org.eclipse.jdt.core.dom.ASTVisitor;
import org.eclipse.jdt.core.dom.CompilationUnit;
import org.eclipse.jdt.core.dom.MethodDeclaration;

public class NOM extends ASTVisitor implements Metric<CKMetricSingleClass> {

    /**
     * 存储方法计数的字段
     */
    private int methods;

    /**
     * 访问方法声明节点
     * 每访问一个方法声明就增加计数
     *
     * @param node 方法声明节点
     * @return false 表示不需要访问子节点
     */
    @Override
    public boolean visit(MethodDeclaration node) {
        methods++;
        return false;
    }

    /**
     * 执行NOM度量计算
     *
     * @param cu           编译单元
     * @param singleMetric 存储度量结果的对象
     * @param result       包含所有度量结果的报告
     */
    @Override
    public void execute(CompilationUnit cu, CKMetricSingleClass singleMetric, Result result) {
        cu.accept(this);
    }

    /**
     * 设置NOM度量结果
     *
     * @param singleMetric 要设置结果的度量对象
     */
    @Override
    public void setSingleMetric(CKMetricSingleClass singleMetric) {
        singleMetric.setNom(methods);
    }
}
